Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


meshchatx/src/frontend/js/rnode/transports/WifiTransport.js f736fe3fb0c7c907f1529b1ec072b76a5ccdd760 (f736fe3f) Text, 5.39 KB

Tff7b72import Te6edf3Transport Tff7b72from Ta5d6ff"./Transport.js"Tb4b4b4;

T8b949e/**
* WiFi/OTA transport for RNode firmware over the device HTTP update endpoint.
*
* Most RNode-derived ESP32 firmwares ship a small HTTP server that exposes
* /update for in-place flashing of the main application image. This transport
* does not provide a serial-style readable/writable pair; instead it exposes
* upload(blob, onProgress) which performs an XMLHttpRequest multipart POST
* with progress events and timeout handling.
*/

Tff7b72const Te6edf3DEFAULT_TIMEOUT_MS Tff7b72= T79c0ff120000Tb4b4b4;

Tff7b72function Te6edf3isValidIpv4Tb4b4b4(Te6edf3trimmedTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3parts Tff7b72= Te6edf3trimmedTb4b4b4.Te6edf3splitTb4b4b4(Ta5d6ff"."Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3partsTb4b4b4.Te6edf3length Tff7b72!== T79c0ff4Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3part Tff7b72of Te6edf3partsTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3partTb4b4b4.Te6edf3length Tff7b72=== T79c0ff0 Tff7b72|| Te6edf3partTb4b4b4.Te6edf3length Tff7b72> T79c0ff3Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3partTb4b4b4.Te6edf3lengthTb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3d Tff7b72= Te6edf3partTb4b4b4.Te6edf3charCodeAtTb4b4b4(Te6edf3iTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3d Tff7b72< T79c0ff48 Tff7b72|| Te6edf3d Tff7b72> T79c0ff57Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72const Te6edf3n Tff7b72= Tffa657NumberTb4b4b4(Te6edf3partTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3n Tff7b72!== Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Te6edf3nTb4b4b4) Tff7b72|| Te6edf3n Tff7b72< T79c0ff0 Tff7b72|| Te6edf3n Tff7b72> T79c0ff255Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3isValidHostnameTb4b4b4(Te6edf3trimmedTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3trimmedTb4b4b4.Te6edf3length Tff7b72> T79c0ff253Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3labels Tff7b72= Te6edf3trimmedTb4b4b4.Te6edf3splitTb4b4b4(Ta5d6ff"."Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3label Tff7b72of Te6edf3labelsTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3labelTb4b4b4.Te6edf3length Tff7b72< T79c0ff1 Tff7b72|| Te6edf3labelTb4b4b4.Te6edf3length Tff7b72> T79c0ff63Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3labelTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"-"Tb4b4b4) Tff7b72|| Te6edf3labelTb4b4b4.Te6edf3endsWithTb4b4b4(Ta5d6ff"-"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3labelTb4b4b4.Te6edf3lengthTb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3c Tff7b72= Te6edf3labelTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3code Tff7b72= Te6edf3cTb4b4b4.Te6edf3charCodeAtTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3isDigit Tff7b72= Te6edf3code Tff7b72>= T79c0ff48 Tff7b72&& Te6edf3code Tff7b72<= T79c0ff57Tb4b4b4;
Tff7b72const Te6edf3isLower Tff7b72= Te6edf3code Tff7b72>= T79c0ff97 Tff7b72&& Te6edf3code Tff7b72<= T79c0ff122Tb4b4b4;
Tff7b72const Te6edf3isUpper Tff7b72= Te6edf3code Tff7b72>= T79c0ff65 Tff7b72&& Te6edf3code Tff7b72<= T79c0ff90Tb4b4b4;
Tff7b72const Te6edf3isHyphen Tff7b72= Te6edf3c Tff7b72=== Ta5d6ff"-"Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3isDigit Tff7b72&& Tff7b72!Te6edf3isLower Tff7b72&& Tff7b72!Te6edf3isUpper Tff7b72&& Tff7b72!Te6edf3isHyphenTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}

Tff7b72export Tff7b72default Tff7b72class Te6edf3WifiTransport Tff7b72extends Te6edf3Transport Tb4b4b4{
T8b949e/**
* @param {string} ipAddressOrHost
* @param {{ timeoutMs?: number, env?: object, scheme?: string }} [options]
*/
Tff7b72constructorTb4b4b4(Te6edf3ipAddressOrHostTb4b4b4, Te6edf3options Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4) Tb4b4b4{
Tff7b72superTb4b4b4(Ta5d6ff"wifi"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3WifiTransportTb4b4b4.Te6edf3isValidHostTb4b4b4(Te6edf3ipAddressOrHostTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3err Tff7b72= Tff7b72new Tf85149ErrorTb4b4b4(Ta5d6ff"invalid_host"Tb4b4b4)Tb4b4b4;
Te6edf3errTb4b4b4.Te6edf3code Tff7b72= Ta5d6ff"INVALID_HOST"Tb4b4b4;
Tff7b72throw Te6edf3errTb4b4b4;
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3host Tff7b72= Te6edf3ipAddressOrHostTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3timeoutMs Tff7b72= Te6edf3optionsTb4b4b4.Te6edf3timeoutMs Tff7b72|| Te6edf3DEFAULT_TIMEOUT_MSTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3env Tff7b72= Te6edf3optionsTb4b4b4.Te6edf3env Tff7b72|| Tb4b4b4(Tff7b72typeof Tffa657window Tff7b72!== Ta5d6ff"undefined" Tff7b72? Tffa657window Tff7b72: Tffa657globalThisTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3scheme Tff7b72= Te6edf3optionsTb4b4b4.Te6edf3scheme Tff7b72|| Ta5d6ff"http"Tb4b4b4;
Tb4b4b4}

Tff7b72static Te6edf3isValidHostTb4b4b4(Te6edf3valueTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3value Tff7b72!== Ta5d6ff"string"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3trimmed Tff7b72= Te6edf3valueTb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3trimmed Tff7b72|| Te6edf3trimmedTb4b4b4.Te6edf3length Tff7b72> T79c0ff253Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3isValidIpv4Tb4b4b4(Te6edf3trimmedTb4b4b4) Tff7b72|| Te6edf3isValidHostnameTb4b4b4(Te6edf3trimmedTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3openTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// No persistent stream, as OTA upload is one-shot. Kept to keep API symmetric.
Tff7b72thisTb4b4b4.Te6edf3opened Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3closeTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3opened Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}

T8b949e/**
* Upload a firmware blob to /update on the configured device.
*
* @param {Blob} blob raw firmware payload
* @param {(percentage: number) => void} [onProgress]
*/
Tff7b72async Te6edf3uploadTb4b4b4(Te6edf3blobTb4b4b4, Te6edf3onProgressTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3blobTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3err Tff7b72= Tff7b72new Tf85149ErrorTb4b4b4(Ta5d6ff"no_payload"Tb4b4b4)Tb4b4b4;
Te6edf3errTb4b4b4.Te6edf3code Tff7b72= Ta5d6ff"NO_PAYLOAD"Tb4b4b4;
Tff7b72throw Te6edf3errTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3Xhr Tff7b72= Tff7b72thisTb4b4b4.Te6edf3envTb4b4b4.Te6edf3XMLHttpRequestTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3XhrTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3err Tff7b72= Tff7b72new Tf85149ErrorTb4b4b4(Ta5d6ff"xhr_unavailable"Tb4b4b4)Tb4b4b4;
Te6edf3errTb4b4b4.Te6edf3code Tff7b72= Ta5d6ff"XHR_UNAVAILABLE"Tb4b4b4;
Tff7b72throw Te6edf3errTb4b4b4;
Tb4b4b4}
Tff7b72return Tff7b72new Tffa657PromiseTb4b4b4(Tb4b4b4(Te6edf3resolveTb4b4b4, Te6edf3rejectTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3xhr Tff7b72= Tff7b72new Te6edf3XhrTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3url Tff7b72= Ta5d6ff`Tffd700${Tff7b72thisTb4b4b4.Te6edf3schemeTffd700}Ta5d6ff://Tffd700${Tff7b72thisTb4b4b4.Te6edf3hostTffd700}Ta5d6ff/updateTa5d6ff`Tb4b4b4;
Te6edf3xhrTb4b4b4.Te6edf3openTb4b4b4(Ta5d6ff"POST"Tb4b4b4, Te6edf3urlTb4b4b4, Tff7b72trueTb4b4b4)Tb4b4b4;
Te6edf3xhrTb4b4b4.Te6edf3timeout Tff7b72= Tff7b72thisTb4b4b4.Te6edf3timeoutMsTb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3xhrTb4b4b4.Te6edf3upload Tff7b72&& Tff7b72typeof Te6edf3onProgress Tff7b72=== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Te6edf3xhrTb4b4b4.Te6edf3uploadTb4b4b4.Te6edf3onprogress Tff7b72= Tb4b4b4(Te6edf3eventTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3eventTb4b4b4.Te6edf3lengthComputable Tff7b72&& Te6edf3eventTb4b4b4.Te6edf3total Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3percentage Tff7b72= Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tb4b4b4(Te6edf3eventTb4b4b4.Te6edf3loaded Tff7b72/ Te6edf3eventTb4b4b4.Te6edf3totalTb4b4b4) Tff7b72* T79c0ff100Tb4b4b4)Tb4b4b4;
Te6edf3onProgressTb4b4b4(Te6edf3percentageTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4;
Tb4b4b4}

Te6edf3xhrTb4b4b4.Te6edf3ontimeout Tff7b72= Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3err Tff7b72= Tff7b72new Tf85149ErrorTb4b4b4(Ta5d6ff"upload_timeout"Tb4b4b4)Tb4b4b4;
Te6edf3errTb4b4b4.Te6edf3code Tff7b72= Ta5d6ff"UPLOAD_TIMEOUT"Tb4b4b4;
Te6edf3rejectTb4b4b4(Te6edf3errTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4;
Te6edf3xhrTb4b4b4.Te6edf3onerror Tff7b72= Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3err Tff7b72= Tff7b72new Tf85149ErrorTb4b4b4(Ta5d6ff"network_error"Tb4b4b4)Tb4b4b4;
Te6edf3errTb4b4b4.Te6edf3code Tff7b72= Ta5d6ff"NETWORK_ERROR"Tb4b4b4;
Te6edf3rejectTb4b4b4(Te6edf3errTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4;
Te6edf3xhrTb4b4b4.Te6edf3onload Tff7b72= Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3xhrTb4b4b4.Te6edf3status Tff7b72>= T79c0ff200 Tff7b72&& Te6edf3xhrTb4b4b4.Te6edf3status Tff7b72< T79c0ff300Tb4b4b4) Tb4b4b4{
Te6edf3resolveTb4b4b4(Tb4b4b4{ Te6edf3statusTff7b72: Te6edf3xhrTb4b4b4.Te6edf3statusTb4b4b4, Te6edf3bodyTff7b72: Te6edf3xhrTb4b4b4.Te6edf3responseText Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3err Tff7b72= Tff7b72new Tf85149ErrorTb4b4b4(Ta5d6ff`Ta5d6ffhttp_Tffd700${Te6edf3xhrTb4b4b4.Te6edf3statusTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Te6edf3errTb4b4b4.Te6edf3code Tff7b72= Ta5d6ff"HTTP_ERROR"Tb4b4b4;
Te6edf3errTb4b4b4.Te6edf3status Tff7b72= Te6edf3xhrTb4b4b4.Te6edf3statusTb4b4b4;
Te6edf3errTb4b4b4.Te6edf3body Tff7b72= Te6edf3xhrTb4b4b4.Te6edf3responseTextTb4b4b4;
Te6edf3rejectTb4b4b4(Te6edf3errTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4;

Tff7b72const Te6edf3formData Tff7b72= Tff7b72new Tff7b72thisTb4b4b4.Te6edf3envTb4b4b4.Te6edf3FormDataTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3formDataTb4b4b4.Te6edf3appendTb4b4b4(Ta5d6ff"update"Tb4b4b4, Te6edf3blobTb4b4b4, Ta5d6ff"firmware.bin"Tb4b4b4)Tb4b4b4;
Te6edf3xhrTb4b4b4.Te6edf3sendTb4b4b4(Te6edf3formDataTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3canOtaFlashTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}

Te6edf3descriptionTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff`Ta5d6ffwifi://Tffd700${Tff7b72thisTb4b4b4.Te6edf3hostTffd700}Ta5d6ff`Tb4b4b4;
Tb4b4b4}
Tb4b4b4}


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────